package com.captjack.validator.aspect;

import com.captjack.validator.Result;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;

import javax.validation.ConstraintViolation;
import java.lang.annotation.Annotation;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Description description.....
 *
 * @author Jack Sparrow
 * @version 1.0.0
 * @date 2018/8/5 01:31
 * package com.captjack.validator.aspect
 */
abstract class AbstractValidator {

    /**
     * 渲染校验结果，根据具体情况自定义返回结果
     *
     * @param set 校验结果
     * @return 返回
     */
    Object renderValidatorResult(Set<ConstraintViolation<Object>> set) {
        Result result = Result.SERVER_EXCEPTION;
        // 快速模式的返回结果
        if (set.size() == 1) {
            result.setMsg(set.iterator().next().getMessage());
        } else {
            // 使用半角逗号作为错误提示分隔符
            result.setMsg(set.stream()
                    .map(ConstraintViolation::getMessage)
                    .collect(Collectors.joining(", ")));
        }
        return result;
    }

    /**
     * 根据切面获取方法指定注解
     *
     * @param joinPoint 切入点
     * @param clazz     注解
     * @param <T>       范型定义返回类型
     * @return 注解实例
     */
    <T extends Annotation> T getMethodAnnotation(ProceedingJoinPoint joinPoint, Class<T> clazz) {
        return ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(clazz);
    }

}
